<?php
class MapaModel extends CustomModel
{

    public function getRutas($pageNumber)
    {
        $rutasAbm = new ABM('rutas');
        return $rutasAbm->getPaginated($pageNumber, array('status' => array(STATUS_ONLINE, STATUS_PENDING)), 10, 'nombre_ruta ASC', true);
    }

    public function getFranjas()
    {
        $franjasABM = new ABM('franjas');
        return $franjasABM->get(array('status' => STATUS_ONLINE), array('dias ASC'));
    }

    public function rutaExists($idRuta)
    {
        $rutaABM = new ABM('rutas');
        return $rutaABM->get(array('idruta' => $idRuta));
    }

    public function nombreExists($nombre)
    {
        $rutaABM = new ABM('rutas');
        return $rutaABM->get(array('nombre_ruta' => $nombre));
    }

    public function guardarRuta($ruta, $puntos, $idRuta = false)
    {
        if (!$idRuta)
        {
            $nuevaRuta = array(
                'nombre_ruta'    => $ruta['nombre_ruta'],
                'camino'         => $ruta['camino'],
                'status'         => $ruta['status'],
                'fecha_creacion' => time()
            );
            $rutaABM = new ABM('rutas');
            // Database transaction
            $this->db->beginTransaction();
            if ($idRuta = $rutaABM->insert($nuevaRuta))
            {
                // Insert puntos, first create no need to delete old ones
                if (!empty($puntos))
                {
                    $puntosABM = new ABM('puntos_por_ruta');
                    $puntosFranjaABM = new ABM('tiempo_por_franja_por_punto');
                    foreach ($puntos as $punto)
                    {
                        $newPunto = array(
                            'fkruta'             => $idRuta,
                            'nombre'             => $punto['nombre'],
                            'latitud'            => $punto['latitud'],
                            'longitud'           => $punto['longitud'],
                            'segundos_anterior'  => (!empty($punto['segundos_anterior']))?$punto['segundos_anterior']:0,
                            'distancia_anterior' => (!empty($punto['distancia_anterior']))?$punto['distancia_anterior']:0,
                            'orden'              => $punto['orden'],
                        );
                        if ($puntoId = $puntosABM->insert($newPunto))
                        {
                            if (!empty($punto['franjas']))
                            {
                                foreach($punto['franjas'] as $idFranja => $segundos)
                                {
                                    $newPuntoPorFranja = array(
                                        'fkruta'            => $idRuta,
                                        'fkpunto_por_ruta'  => $puntoId,
                                        'fkfranja'          => $idFranja,
                                        'segundos_anterior' => $segundos
                                    );
                                    if ($puntosFranjaABM->insert($newPuntoPorFranja, false))
                                    {
                                    }
                                    else
                                    {
                                        $this->db->rollbackTransaction();
                                        return false;
                                    }
                                }
                            }
                        }
                        else
                        {
                            $this->db->rollbackTransaction();
                            return false;
                        }
                    }
                }
                $this->db->commitTransaction();
                return $idRuta;
            }
            else
            {
                $this->db->rollbackTransaction();
                return false;
            }
        }
        else
        {
            $actualizarRuta = array(
                'nombre_ruta'    => $ruta['nombre_ruta'],
                'camino'         => $ruta['camino'],
                'status'         => $ruta['status'],
            );
            $rutaABM = new ABM('rutas');
            // Database transaction
            $this->db->beginTransaction();
            if ($rutaABM->update(array('idruta' => $idRuta), $actualizarRuta))
            {
                // Delete old franjas and puntos
                $delPuntosPorFranjas = "DELETE FROM tiempo_por_franja_por_punto WHERE fkruta = $idRuta;";
                $delPuntosPorRuta    = "DELETE FROM puntos_por_ruta WHERE fkruta = $idRuta;";
                if ((!$this->db->rawQuery($delPuntosPorFranjas)) || (!$this->db->rawQuery($delPuntosPorRuta)))
                {
                    $this->db->rollbackTransaction();
                    return false;
                }
                // Insert puntos
                if (!empty($puntos))
                {
                    $puntosABM = new ABM('puntos_por_ruta');
                    $puntosFranjaABM = new ABM('tiempo_por_franja_por_punto');
                    foreach ($puntos as $punto)
                    {
                        $newPunto = array(
                            'fkruta'             => $idRuta,
                            'nombre'             => $punto['nombre'],
                            'latitud'            => $punto['latitud'],
                            'longitud'           => $punto['longitud'],
                            'segundos_anterior'  => (!empty($punto['segundos_anterior']))?$punto['segundos_anterior']:0,
                            'distancia_anterior' => (!empty($punto['distancia_anterior']))?$punto['distancia_anterior']:0,
                            'orden'              => $punto['orden'],
                        );
                        if ($puntoId = $puntosABM->insert($newPunto))
                        {
                            if (!empty($punto['franjas']))
                            {
                                foreach($punto['franjas'] as $idFranja => $segundos)
                                {
                                    $newPuntoPorFranja = array(
                                        'fkruta'            => $idRuta,
                                        'fkpunto_por_ruta'  => $puntoId,
                                        'fkfranja'          => $idFranja,
                                        'segundos_anterior' => $segundos
                                    );
                                    if ($puntosFranjaABM->insert($newPuntoPorFranja, false))
                                    {
                                    }
                                    else
                                    {
                                        $this->db->rollbackTransaction();
                                        return false;
                                    }
                                }
                            }
                        }
                        else
                        {
                            $this->db->rollbackTransaction();
                            return false;
                        }
                    }
                }
                $this->db->commitTransaction();
                return $idRuta;
            }
            else
            {
                $this->db->rollbackTransaction();
                return false;
            }
        }
    }

    public function getRuta($idRuta)
    {
        $rutaABM = new ABM('rutas');
        if ($ruta = $rutaABM->get(array('idruta' => $idRuta, 'status' => array(STATUS_ONLINE, STATUS_PENDING))))
        {
            // Ruta
            $ruta = $ruta[$idRuta];
            $ruta['puntos_camino'] = unserialize($ruta['camino']);
            // Puntos
            $puntosABM = new ABM('puntos_por_ruta');
            $puntosFranjaABM = new ABM('tiempo_por_franja_por_punto');
            $ruta['puntos'] = $puntosABM->get(array('fkruta' => $idRuta), 'orden ASC');
            $ruta['puntos_por_franja'] = $puntosFranjaABM->get(array('fkruta' => $idRuta), false, false, false);
            return $ruta;
        }
        else
        {
            return false;
        }
    }

    public function borrarRuta($idRuta)
    {
        $rutaABM = new ABM('rutas');
        if ($rutaABM->update(array('idruta' => $idRuta), array('status' => STATUS_OFFLINE)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public function getViajesConRuta($idRuta)
    {
        $viajesAbm = new ABM('viajes');
        return $viajesAbm->get(array('fkruta' => $idRuta, 'status' => array(STATUS_ONLINE, STATUS_PENDING, STATUS_HIDDEN)));
    }

}
?>